package easy;


import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


/**
 * @author wbdengtt
 * @date 2021/1/4 15:08
 */
public class SolutionTest {

    @Test
    public void test7() {
        Solution7 solution7 = new Solution7();
        System.out.println(solution7.reverse(-987));
    }

    @Test
    public void test70() {
        System.out.println(Solution70.climbStairs(45));
    }

    @Test
    public void test27() {
        int[] nums = {0,1,2,2,3,0,4,2};
        int temp = Solution27.removeElement(nums,2);
        System.out.println(temp);
    }
    @Test
    public void test9() {
        System.out.println(Solution9.isPalindrome(89));
    }
    @Test
    public void test500() {
        String[] words = {"Hello", "Alaska", "Dad", "Peace"};
        System.out.println(Solution500.findWords(words));
    }
    @Test
    public void test830() {
        String s = "abcdddeeeeaabbbcd";
        Solution830.largeGroupPositions(s);
    }

}


/**
 * 830 较大分组的位置
 */
class Solution830{
    public static List<List<Integer>> largeGroupPositions(String s) {
        List<List<Integer>> result = new ArrayList<>();
        // 总长度
        int length = s.length();
        // 左指针
        int left = 0;
        while (left < length) {
            // 计数
            int count = 1;
            while (left + count < length && s.charAt(left) == s.charAt(left+count) ) {
               count ++;
            }
            if (count>=3) {

                result.add(Arrays.asList(left, left+count-1));
            }
            left = left + count;

        }
        return result;
    }
}
/**
 * 500. 键盘行
 */
class Solution500 {
    public static String[] findWords(String[] words) {
        String str1 = "qwertyuiop";
        String str2 = "asdfghjkl";
        String str3 = "zxcvbnm";
        List<String> stringList = new ArrayList<>();
        for (String str:words) {
            String strtemp = str.toLowerCase();
            String temp = strtemp.substring(0,1);
            if (str1.contains(temp)) {
                if (find(strtemp,str1)) {
                    stringList.add(str);
                }
            } else if (str2.contains(temp)) {
                if (find(strtemp,str2)) {
                    stringList.add(str);
                }
            }
            else {
                if (find(strtemp,str3)) {
                    stringList.add(str);
                }
            }
        }
        return stringList.toArray(new String[0]);
    }
    private static boolean find(String s,String template) {
        for (int i =0; i < s.length(); i++) {
            if (!template.contains(s.substring(i,i+1))) {
                return false;
            }
        }
        return true;
    }

}

/**
 * 9 回文数
 * 提示不能将数据转为字符串
 */
class Solution9 {
    public static boolean isPalindrome(int x) {
        long temp = (long) x;
        long r = 0;
        while (x > 0) {
            r = r*10 + x%10;
            x = x/10;
        }
        return temp == r;

    }
}
/**
 * 移除元素 27
 */
class Solution27 {
    public static int removeElement(int[] nums, int val) {
        int j=0;
        for (int i = 0; i<nums.length; i++) {
            if (nums[i] !=val) {
                nums[j] = nums[i];
                j++;
            }
        }
        return j;
    }
}
/**
 * 爬楼梯
 * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
 * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？
 *
 * 这其实也是一个菲薄那些数列
 * f(n) = f(n-1) + f(n-2)
 * 因为可以上1步或者2步 那么爬上n级台阶就好方法总数就是n-1 和 n-2 总数的方法总数和
 */
class Solution70 {
    public static  int climbStairs(int n) {
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        int Fn减1=2;
        int Fn减2=1;
        int result = 0;
        while (n>2) {
            result = Fn减1+Fn减2;
            Fn减2=Fn减1;
            Fn减1=result;
            n--;
        }
        return result;
    }
}

/**
 * 整数反转
 * 2021年1月4日 15:24:06
 * 这里使用了StringBuilder的函数
 */
class Solution7{
    public int reverse(int x) {
        String str = String.valueOf(x);
        // 取符号位。也有可能是数字。有可能不是符号
        String zero = str.substring(0,1);

        str = str.substring(1);
        StringBuilder stringBuilder = new StringBuilder(str);
        stringBuilder.reverse();
        // 如果是符号，就放在反转后的前面
        if ("+".equals(zero) || "-".equals(zero)) {
            str = zero + stringBuilder.toString();
        }else {
            // 不是符号就放在末尾
            str = stringBuilder.toString() + zero;
        }
        try {
            return Integer.parseInt(str);
        } catch (Exception e) {
            // 溢出会报错。就返回0
            return 0;
        }
    }
}
/**
 * 斐波那楔数列
 * 2021年1月4日 15:19:13
  */
class Solution509{
    public int fib(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        return fib(n-1) + fib(n-2);
    }
}
